var ArrayList = (function( superClass ) {
	//__extends(ArrayList, superClass);
	/**
	 * 构造函数
	 * @method ArrayList#constructor
	 * @param source {Array<any>} 数据源
	 */
	function ArrayList(source) {
		if (!source) {
			source = null;
		}

		//superClass.call(this);

		if (source && (source instanceof Array)) {
			this.source = source;
			this.length = source.length;
		}
		else {
			this.source = [];
			this.length = 0;
		}
	}

	/**
	 * 是否包含某项数据
	 * @method ArrayList#contains
	 * @param item {any}
	 * @returns {boolean}
	 */
	ArrayList.prototype.contains = function (item) {
		return this.getItemIndex(item) != -1;
	};
	/**
	 * 检测索引是否超出范围
	 */
	ArrayList.prototype.checkIndex = function (index) {
		if (index < 0 || index >= this.source.length) {
			return true;
		}
		return false;
	};
	/**
	 * 获取指定索引处的项目
	 * @method ArrayList#getItemAt
	 * @param index {number}
	 * @returns {any}
	 */
	ArrayList.prototype.getItemAt = function (index) {
		return this.source[index];
	};
	/**
	 * 如果项目位于列表中,返回该项目的索引。否则返回-1。
	 * @method ArrayList#getItemIndex
	 * @param item {any}
	 * @returns {number}
	 */
	ArrayList.prototype.getItemIndex = function (item) {
		var length = this.source.length;
		for (var i = 0; i < length; i++) {
			if (this.source[i] === item) {
				return i;
			}
		}
		return -1;
	};
	/**
	 * 向列表末尾添加指定项目。等效于 addItemAt(item, length)。
	 * @method ArrayList#addItem
	 * @param item {any}
	 */
	ArrayList.prototype.addItem = function (item) {
		this.source.push(item);
		this.length++;
		//this.dispatchEvent("ADD");
		//this.dispatchEvent("ADD", this.source.length - 1, -1, [item]);
	};
	/**
	 * 在指定的索引处添加项目。
	 * 任何大于已添加项目的索引的项目索引都会增加 1。
	 * @method ArrayList#addItemAt
	 * @param item {any}
	 * @param index {number}
	 */
	ArrayList.prototype.addItemAt = function (item, index) {
		if ( !this.checkIndex(index) ) {
			this.source.splice(index, 0, item);
			this.length++;
		}	
	};
	/**
	 * 删除列表中的所有项目。
	 * @method ArrayList#removeAll
	 */
	ArrayList.prototype.removeAll = function () {
		var items = this.source.concat();
		this.source.length = 0;
		this.length = 0;
	};
	/**
	 * 删除指定索引处的项目并返回该项目。原先位于此索引之后的所有项目的索引现在都向前移动一个位置。
	 * @method ArrayList#removeItemAt
	 * @param index {number}
	 * @returns {any}
	 */
	ArrayList.prototype.removeItemAt = function (index) {
		if (this.checkIndex(index)) {
			return;
		}

		var item = this.source.splice(index, 1)[0];
		this.length--;
		return item;
	};
	/**
	 * 替换在指定索引处的项目，并返回该项目。
	 * @method ArrayList#replaceItemAt
	 * @param item {any}
	 * @param index {number}
	 * @returns {any}
	 */
	ArrayList.prototype.replaceItemAt = function (item, index) {
		if (this.checkIndex(index)) {
			return;
		}

		var oldItem = this.source.splice(index, 1, item)[0];
		return oldItem;
	};
	/**
	 * 用新数据源替换原始数据源，此方法与直接设置source不同，它不会导致目标视图重置滚动位置。
	 * @method ArrayList#replaceAll
	 * @param newSource {Array<any>} 新的数据源
	 */
	ArrayList.prototype.replaceAll = function (newSource) {
		if (!newSource) {
			newSource = [];
		}

		var newLength = newSource.length;
		var oldLenght = this.source.length;

		for (var i = newLength; i < oldLenght; i++) {
			this.removeItemAt(newLength);
		}

		for (i = 0; i < newLength; i++) {
			if (i >= oldLenght) {
				this.addItemAt(newSource[i], i);
			} else {
				this.replaceItemAt(newSource[i], i);
			}
		}

		this.source = newSource;
	};
	/**
	 * 移动一个项目
	 * 在oldIndex和newIndex之间的项目，
	 * 若oldIndex小于newIndex,索引会减1
	 * 若oldIndex大于newIndex,索引会加1
	 * @method ArrayList#moveItemAt
	 * @param oldIndex {number}
	 * @param newIndex {number}
	 * @returns {any}
	 */
	ArrayList.prototype.moveItemAt = function (oldIndex, newIndex) {
		if (this.checkIndex(oldIndex)) {
			return;
		}
		if (this.checkIndex(newIndex)) {
			return;
		}

		var item = this.source.splice(oldIndex, 1)[0];
		this.source.splice(newIndex, 0, item);

		return item;
	};

	return ArrayList;
})(ninejs.EventDispatcher);